﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Generic.Contract;
using Generic.Data.Manager;
using Contract.Business.Entity;
using Contract.Business.Filter;
using DataEntity;

namespace Contract.Data.Manager
{
    //Criado por : Gustavo
    //Data       : 11/30/2011 3:52:57 PM
    public class DMSubGrupoTamanho : DMGeneric<BESubGrupoTamanho, FESubGrupoTamanho>
    {
        databaseDataContext dc;

        #region Override

        public override BESubGrupoTamanho Salvar(BESubGrupoTamanho entidade)
        {
            try
            {
                BESubGrupoTamanho exist = this.ObterEntidade(entidade.CodigoSubGrupo, entidade.CodigoTamanho);
                if (exist == null)
                    entidade.Codigo = Incluir(entidade);
                else
                    Alterar(entidade);

                return entidade;
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override void Excluir(BESubGrupoTamanho entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from r in dc.DESubGrupoTamanhos
                            where
                                r.CodigoSubGrupo == entidade.CodigoSubGrupo &&
                                r.CodigoTamanho == entidade.CodigoTamanho
                            select r;

                    DESubGrupoTamanho de = q.First();

                    dc.DESubGrupoTamanhos.DeleteOnSubmit(de);

                    dc.SubmitChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override BESubGrupoTamanho ObterEntidade(int codigo)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DESubGrupoTamanhos
                            where
                                e.CodigoSubGrupo == codigo
                            select e;

                    DESubGrupoTamanho entidade = q.FirstOrDefault();
                    if (entidade != null)
                        return entidade.ConvertToBE(1);
                    else
                        return null;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public BESubGrupoTamanho ObterEntidade(int codigoSubGrupo, int codigoTamanho)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DESubGrupoTamanhos
                            where
                                e.CodigoSubGrupo == codigoSubGrupo &&
                                e.CodigoTamanho == codigoTamanho
                            select e;

                    DESubGrupoTamanho entidade = q.FirstOrDefault();
                    if (entidade != null)
                        return entidade.ConvertToBE(1);
                    else
                        return null;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override List<BESubGrupoTamanho> ObterTodos(FESubGrupoTamanho filter)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DESubGrupoTamanhos
                            where
                            (
                                (((filter.CodigoSubGrupo != null)
                                && (e.CodigoSubGrupo == filter.CodigoSubGrupo)) || (filter.CodigoSubGrupo == null)) &&

                                (((filter.CodigoTamanho != null)
                                && (e.CodigoTamanho == filter.CodigoTamanho)) || (filter.CodigoTamanho == null)) &&

                                (((filter.Preco != null)
                                && (e.Preco == filter.Preco)) || (filter.Preco == null))
                            )
                            select e;

                    List<DESubGrupoTamanho> deSubGrupoTamanho = q.ToList();

                    List<BESubGrupoTamanho> retorno = new List<BESubGrupoTamanho>();

                    foreach (DESubGrupoTamanho de in deSubGrupoTamanho)
                        retorno.Add(de.ConvertToBE(1));

                    return retorno;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion

        #region Métodos Auxiliares

        private int Incluir(BESubGrupoTamanho entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    DESubGrupoTamanho de = new DESubGrupoTamanho();
                    de.ConvertFromBE(entidade);

                    dc.DESubGrupoTamanhos.InsertOnSubmit(de);

                    dc.SubmitChanges();

                    return 0;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void Alterar(BESubGrupoTamanho entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DESubGrupoTamanhos
                            where e.CodigoSubGrupo == entidade.CodigoSubGrupo &&
                                  e.CodigoTamanho == entidade.CodigoTamanho
                            select e;

                    DESubGrupoTamanho de = q.First();

                    de.Preco = entidade.Preco;

                    dc.SubmitChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion
    }
}
